package user_api

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"muziai-server/models/ctype"
	"muziai-server/utils/jwts"
	"muziai-server/utils/res"
	"regexp"
)

type RegisterRequest struct {
	Value        string               `json:"value"`                             //邮箱和手机号
	RegisterType ctype.RegisterSource `json:"registerType"`                      //1邮箱 2手机号
	Captcha      string               `json:"captcha"`                           //图形验证码
	CaptchaID    string               `json:"captchaId"`                         //图形验证码id
	Code         string               `json:"code"`                              //用户输入的验证码
	Step         int8                 `json:"step" binding:"required,oneof=1 2"` //1 第一步 2 第二步数
}

var CaptchaErrMap = map[string]int{}

func (u UserApi) LoginView(c *gin.Context) {
	//1.校验图形验证码
	//2.给邮箱，手机号发验证码
	//3.校验验证码

	var cr RegisterRequest
	err := c.ShouldBindJSON(&cr)
	if err != nil {
		res.FailWithError(c, err)
		return
	}
	switch cr.Step {
	case 1:
		//校验图形验证码
		errCount := CaptchaErrMap[cr.CaptchaID]
		fmt.Println(CaptchaErrMap)
		if errCount >= 3 {
			res.FailWithMsg(c, "图形验证码错误过多，请重新生成")

			return
		}
		ok := store.Verify(cr.CaptchaID, cr.Captcha, false)
		if !ok {

			res.FailWithMsg(c, "图形验证码校验失败")
			CaptchaErrMap[cr.CaptchaID] = errCount + 1
			return
		}
		fmt.Println("校验成功")
		delete(CaptchaErrMap, cr.CaptchaID)
		//判断是邮箱还是手机号
		if cr.RegisterType == ctype.EmailRegister {

			// 编译正则表达式
			regex := regexp.MustCompile(`^[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,255}.[a-zA-Z]{2,}$`)
			// 使用正则表达式进行匹配
			match := regex.MatchString(cr.Value)
			if !match {
				res.FailWithError(c, err)
				return
			}
			//发送邮箱,异步方式
			code, msg := u.UserService.UserSendCode(cr.RegisterType, cr.Value, ctype.RegisterTempalteID)
			store.Set(cr.Value, code)

			res.OkWithMsg(c, msg)
			return
		}

	case 2:
		if cr.RegisterType == 1 {

			// 编译正则表达式
			regex := regexp.MustCompile(`^[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,255}.[a-zA-Z]{2,}$`)
			// 使用正则表达式进行匹配
			match := regex.MatchString(cr.Value)
			if !match {
				res.FailWithError(c, err)
				return
			}
			if cr.Code == "" {
				res.FailWithMsg(c, "邮件验证码必填")
				return
			}
			ok := store.Verify(cr.Value, cr.Code, false)
			if !ok {
				res.FailWithMsg(c, "邮箱验证码错误")
				return
			}
			user, findok := u.UserService.HasUser(ctype.EmailRegister, cr.Value)
			if !findok {

				user, err = u.UserService.UserCreate(ctype.EmailRegister, cr.Value)
				if err != nil {
					logrus.Error(err)
					res.FailWithError(c, err)
					return
				}
			}

			//生成token
			token, err1 := jwts.GetToken(jwts.ClaimsUserInfo{
				UserID: user.ID,
				Role:   user.Role,
			})

			if err1 != nil {
				logrus.Fatal("生成token失败")
				return
			}
			res.OkWithData(c, token)

		}

	}

}
